import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

import javax.swing.text.html.parser.Entity;

/*
 * @lc app=leetcode.cn id=523 lang=java
 *
 * [523] 连续的子数组和
 *
 * https://leetcode.cn/problems/continuous-subarray-sum/description/
 *
 * algorithms
 * Medium (28.49%)
 * Likes:    501
 * Dislikes: 0
 * Total Accepted:    94.2K
 * Total Submissions: 330.7K
 * Testcase Example:  '[23,2,4,6,7]\n6'
 *
 * 给你一个整数数组 nums 和一个整数 k ，编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组：
 * 
 * 
 * 子数组大小 至少为 2 ，且
 * 子数组元素总和为 k 的倍数。
 * 
 * 
 * 如果存在，返回 true ；否则，返回 false 。
 * 
 * 如果存在一个整数 n ，令整数 x 符合 x = n * k ，则称 x 是 k 的一个倍数。0 始终视为 k 的一个倍数。
 * 
 * 
 * 
 * 示例 1：
 * 
 * 
 * 输入：nums = [23,2,4,6,7], k = 6
 * 输出：true
 * 解释：[2,4] 是一个大小为 2 的子数组，并且和为 6 。
 * 
 * 示例 2：
 * 
 * 
 * 输入：nums = [23,2,6,4,7], k = 6
 * 输出：true
 * 解释：[23, 2, 6, 4, 7] 是大小为 5 的子数组，并且和为 42 。 
 * 42 是 6 的倍数，因为 42 = 7 * 6 且 7 是一个整数。
 * 
 * 
 * 示例 3：
 * 
 * 
 * 输入：nums = [23,2,6,4,7], k = 13
 * 输出：false
 * 
 * 
 * 
 * 
 * 提示：
 * 
 * 
 * 1 
 * 0 
 * 0 
 * 1 
 * 
 * 
 */

// @lc code=start
class Solution {
    /**
     * @param nums
     * @param k
     * @return
     */
    public boolean checkSubarraySum(int[] nums, int k) {
       
        if (nums.length<2) {
            return false;
        }
        HashMap<Integer,Integer> dHashMap=new HashMap();
        int[] data=new int[nums.length+1];
        for (int i = 0; i < nums.length; i++) {
            nums[i]%=k;
            data[i+1]=(data[i]+nums[i]);
        }
        for (int i = 0; i < data.length; i++) {
            dHashMap.put(data[i]%k, dHashMap.getOrDefault(data[i]%k, 0)+1);
        }
        for (Integer values : dHashMap.values()) {
            if (values>1) {
                return true;
            }
        }
        
        return false;

    }
}
// @lc code=end

